%% 使用 zhbook 文档类生成中文科技书籍的示例文档
%%
%% 作者：陈渝 向勇，yuchen@tsinghua.edu.cn
%% 项目主页: https://github.com/chyyuu/simple_os_book
%%
%% 本样例文档中用到了胡海星提供的zhbook 文档类生成中文文档，在此对他表示感谢。
%%
\documentclass{zhbook}


 \usepackage{listings}
 \usepackage{xcolor}
 \lstset{
   %行号
   numbers=left,
   %背景框
   framexleftmargin=10mm,
   frame=none,
   %背景色
   %backgroundcolor=\color[rgb]{1,1,0.76},
   backgroundcolor=\color[RGB]{245,245,244},
   %样式
   keywordstyle=\bf\color{blue},
   identifierstyle=\bf,
   numberstyle=\color[RGB]{0,192,192},
   commentstyle=\it\color[RGB]{0,96,96},
   stringstyle=\rmfamily\slshape\color[RGB]{128,0,0},
   %显示空格
   showstringspaces=false
 }
 
 % \dangericon 表示警告的图标
 \font\manfnt=manfnt
 \newcommand*{\dangericon}{\manfnt\char127}
 
 % note 环境表示需特别注意的内容
 \newenvironment{note}
 {\vskip1.5ex\par\noindent\llap{\dangericon\hskip2mm}\textbf{注意：}}
 {\vskip1.5ex}
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 设置论文的中文封面

% 论文标题，不可换行
\title{操作系统的简单实现与基本原理 \newline --- 基于ucore OS + RISC-V}
\englishtitle{Simple Implementation and Basic Principle of Operating Systems \\ --- based on ucore OS + RISC-V}
% 如果论文标题过长，可以分两行，第一行用\titlea{}定义，第二行用\titleb{}定义，将上面的\title{}注释掉
%\titlea{操作系统的基本原理与简单实现}
%\titleb{--基于ucore OS + RISC-V}

% 书籍作者姓名
\author{陈渝 \ \ 向勇}
% 书籍出版社
\publisher{}
%\publishercity{北\hspace{1.5em}京}
\date{二〇一八年}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\, 
% 制作中文封面
\maketitle
% 制作英文封面
% \makeenglishtitle

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 开始前言部分
\frontmatter

%\begin{abstract}

本书想讲解一个问题：操作系统是如何帮助应用程序在硬件上运行的。

操作系统课是计算机科学与技术专业的一门重要的专业基础课，但仅仅介绍操作系统这个单一知识是不够的。传统操作系统课程的一个重要问题，就是把操作系统进行高度的抽象、割裂，使得学生在学习操作系统时，先从各种相对孤立的抽象概念原理为主的知识点进行学习，缺少对“为什么”，“具体如何做的”等问题的深刻和综合的理解。学完之后，可能还存在对一个完整操作系统的全貌缺少把握，对操作系统中各个关键组成部分的联系缺少认识，不能站在计算机系统的角度来看待操作系统等问题。

虽然学生已经学习了算法与数据结构、编译原理、计算机原理、汇编程序设计，并从不同的角度对计算机系统进行了了解。当学生在面临一个具体问题的时候，比如理解一个显示”hello worlod！“的C语言程序是如何在一个具体硬件上完成这个字符串的显示时，是需要综合考虑到这个C程序是如何被编译器变成执行程序，被操作系统加载执行，如何被操作系统通过文件的方式来驱动相应的外设显示字符串等。如果学生能够理解这些具体的过程，并能进一步归纳总结，形成自己理解的概念，原理，规律，方法等，那么对站在计算机系统来看操作系统，就会有更深入的掌握了。

操作系统是一个软件，讲述一个操作系统的总体架构，模块划分，渐进扩展和具体实现会加深对操作系统原理的理解。操作系统离不开硬件的支持，如果缺少对硬件的理解，那么操作系统在硬件内部的运行过程就是一个黑盒子，使得很难深刻理解操作性与硬件的配合所提供的强大功能。操作系统的主体一般是通过高级语言实现的，并由编译器生成机器码在硬件上执行，如果不理解高级语言与机器码的对应关系，不理解编译器生成的执行程序的内容，那么对于操作系统如何加载运行程序，如何进行运行程序的切换等就缺少综合的考虑。


为此，本书的讲述方式是从具体实践到概括抽象，从操作系统需要应对的需求出发，从简单的IO输出支持到最后的shell运行支持，逐步实现和扩展操作系统的能力，并逐步完成对操作系统概念、定义、原理、算法等的归纳总结。在讲解操作系统的基本原理之前，将介绍在基于RISC-V CPU的计算机系统上用C语言设计实现一个简单操作系统ucore OS，分析此操作系统在一个具体的计算机硬件系统上执行过程。并对编译器、计算机组成原理、操作系统的相互关系进行系统的介绍。使得抽象的操作系统概念原理能与具体的操作系统设计实现能够相互印证，相互补充。为读者对操作系统的学习和掌握打下坚实的基础。希望通过本书的介绍，可以使读者全面地了解和掌握操作系统的目标、功能、机制、策略、基本原理与算法等的思路，并能够领会操作系统的功能和实现过程。

本书的内容展开是围绕着一个操作系统从无到有的过程来讲解的，并配合计算机组成原理和编译原理方面的补充。这在某种程度上也反映了操作系统和计算机硬件组成的发展历史。具体而言，本书内容包括：操作系统概述；操作系统的启动；操作系统与硬件进行的基本交互；操作系统对物理内存的管理；操作系统对CPU的分时复用；可在用户态运行的程序；虚拟内存的设计与实现；调度算法；同步和通信；死锁；进程间通信；文件系统。

%\end{abstract}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 论文的前言，应放在目录之前，中英文摘要之后
%
\begin{preface}

对于在校的学生和已经参加工作的工程师而言，能否以较小的时间和精力比较全面地了解操作系统呢？陆游老夫子说过“纸上得来终觉浅，绝知此事要躬行”，也许在了解基本的操作系统概念和原理基础上，通过实际动手来一步一步分析、设计和实现一个微型化的操作系统，会发现操作系统原来如此，并会发现操作系统的概念原理与实际实现之间有紧密的联系和巨大的差异。

早期开放开源的UNIX操作系统和MIT教授 Frans Kaashoek 等基于UNIX v6设计的xv6操作系统给了我们启发：对一个计算机专业的本科生而言，设计实现一个操作系统有挑战但是可行！但x86相对封闭且复杂和有一定历史包袱的CPU硬件接口给OS学习带来了一定的挑战。1980年前后，UC Berkeley的Dave Patterson主导了Berkeley RISC项目并设计了其第一代的处理器RISC I，并在2014年发展到了开放且开源的第五代指令集架构RISC-V。本书想进行这样的教学尝试，以操作系统基本原理为教学引导，以简洁的RISC-V CPU为底层硬件基础，以C语言为主，设计并实现一个微型但全面的“麻雀”操作系统—ucore。期望能够采用简化的计算机硬件为基础，以操作系统的基本概念和核心原理为实践指导，逐步解析操作系统各种知识点和对应的实验，做到有“理”可循和有“码”可查，最终让读者了解和掌握操作系统的原理、设计与实现。

\paragraph{读者要具备的背景知识}
操作系统课程一般安排在本科大二或大三上课。这其中的原因是希望学生已经完成了算法与数据结构、编译原理、计算机原理、汇编程序设计等课程的学习。如果读者没有完成上述课程的学习，本书希望读者能够有一个Linux系统可以用来做实验，这需要有基本的Linux的使用操作能力，另外有基本的基于C语言的算法和数据结构编程能力，最后就是对计算机的基本原理，比如CPU，内存在功能上的体现有基本的了解。

本书希望通过设计实现操作系统来更好地理解操作系统原理和概念。设计实现操作系统其实就是设计实现一个可以管理CPU、内存和各种外设，并管理和服务应用软件的系统软件。为此还是需要先了解一些基本的计算机原理和编程的知识。本书的例子和描述需要读者学习过计算机原理课程、程序设计课程，掌握C语言编程（了解指针等的编程）。如需完成基于RISCore实验，则对基于RISC-V的体系结构有一定的了解，大致了解RISC-V的汇编语言。

\paragraph{本书结构}

本书的知识内容由XXX章组成，旨在通过分析操作系统的具体设计与运行来阐述操作系统的核心概念。

\paragraph{操作系统初级阶段}	

\begin{itemize}
	\item
	\subparagraph{绪论} 这一章首先介绍了操作系统的历史，从中了解操作系统与应用需求和计算机硬件是相互促进，逐步发展起来的。然后通过分析"hello　world"这个简单程序的生命周期，介绍编译、操作系统、计算机原理等的相关知识和在计算机系统层面上的相互关。并进一步描述了ucore-os操作系统的功能和总体结构，以及操作系统的主要概念和主题。最后介绍了操作系统所依赖的计算机硬件架构的主要概念和一个具体的RISC-V CPU。

	\item
	\subparagraph{启动操作系统}本章介绍
	\item
	\subparagraph{内存管理管理}本章介绍
	\item
	\subparagraph{并发管理}本章介绍
	\item
	\subparagraph{异常与中断管理}本章介绍
	\item
	\subparagraph{特权级管理}本章介绍
\end{itemize}

\paragraph{操作系统中级阶段}
\begin{itemize}
	\item
	\subparagraph{虚拟内存管理}本章介绍	
	\item
	\subparagraph{进程管理}本章介绍
	\item
	\subparagraph{处理器调度}本章介绍	
	\item
	\subparagraph{同步互斥管理}本章介绍
	\item
	\subparagraph{死锁}本章介绍					
	\item
	\subparagraph{文件系统管理}本章介绍		
\end{itemize}	

\paragraph{操作系统高级阶段}
\begin{itemize}
	\item
	\subparagraph{64位CPU支持}本章介绍		
	\item
	\subparagraph{多核/SMP管理与调度}本章介绍	
	\item
	\subparagraph{同步互斥进阶}本章介绍	
	\item
	\subparagraph{日志文件系统}本章介绍		
	\item
	\subparagraph{虚拟文件系统}本章介绍		
	\item
	\subparagraph{基于rust语言的OS设计}本章介绍	
	\item
	\subparagraph{高并发度OS设计}本章介绍		
\end{itemize}

\vspace{1cm}
\begin{flushright}
陈渝 \ 向勇\\
2018年夏于清华园
\end{flushright}

\end{preface}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 生成论文目次
\tableofcontents

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 生成插图清单。如无需插图清单则可注释掉下述语句。
\listoffigures

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 生成附表清单。如无需附表清单则可注释掉下述语句。
\listoftables

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 开始正文部分
\mainmatter

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\include{intro}
%\include{boot}
%\include{memory}
%\include{thread}
%\include{process}
%\include{vm}
%\include{schedule}
%\include{syncmutex}
%\include{deadlock}
%\include{ipc}
%\include{filesystem}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 致谢，应放在《结论》之后
\begin{acknowledgement}
  首先感谢
\end{acknowledgement}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 附录
\appendix

\input{appendix}

\section{参考文献}

为了将论文迅速存储入电子计算机，可以提供有关的输入数据。可以编排分类索引、著者索
引、关键词索引等。

% 参考文献。应放在\backmatter之前。
% 推荐使用BibTeX，若不使用BibTeX时注释掉下面一句。
\nocite{*}
\bibliography{sosbook}
% 不使用 BibTeX
%\begin{thebibliography}{2}
%
%\bibitem{deng:01a}
%{邓建松,彭冉冉,陈长松}.
%\newblock {\em \LaTeXe{}科技排版指南}.
%\newblock 科学出版社,书号:7-03-009239-2/TP.1516, 北京, 2001.
%
%\bibitem{wang:00a}
%王磊.
%\newblock {\em \LaTeXe{}插图指南}.
%\newblock 2000.
%\end{thebibliography}

% 附录，必须放在参考文献后，backmatter前
\appendix


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{document}
